package com.example.demo.utils;

import com.github.s7connector.impl.serializer.converter.BitConverter;
import com.github.s7connector.impl.serializer.converter.IntegerConverter;
import com.github.s7connector.impl.serializer.converter.LongConverter;
import com.github.s7connector.impl.serializer.converter.RealConverter;
import com.github.s7connector.impl.serializer.converter.StringConverter;
import java.lang.reflect.Field;

/**
 * 字节数据解析工具类（兼容无参构造的StringConverter）
 */
public class ValueCall {
    // 基础类型转换器（复用单例）
    private static final BitConverter booleanConverter = new BitConverter();
    private static final IntegerConverter intConverter = new IntegerConverter();
    private static final RealConverter doubleConverter = new RealConverter();
    private static final LongConverter longConverter = new LongConverter();

    /**
     * 解析布尔值
     */
    public static Boolean aBoolean(byte[] allData, int byteOffset, int bit) {
        return booleanConverter.extract(Boolean.class, allData, byteOffset, bit);
    }

    /**
     * 解析整数
     */
    public static int aint(byte[] allData, int byteOffset) {
        return intConverter.extract(Integer.class, allData, byteOffset, 0);
    }
    /**
     * 解析浮点数
     */
    public static Double aDouble(byte[] allData, int byteOffset) {
        return doubleConverter.extract(Double.class, allData, byteOffset, 0);
    }
    /**
     * 解析Dint类型(32位整数)
     */
    public static long adint(byte[] allData, int byteOffset) {
        return longConverter.extract(Long.class, allData, byteOffset, 0);
    }

    /**
     * 解析字符串（通过反射设置长度，兼容无参构造的StringConverter）
     */
    public static String aString(byte[] allData, int byteOffset, int length) {
        StringConverter stringConverter = new StringConverter();
        try {
            // 通过反射获取并设置"length"字段（适配无参构造版本）
            Field lengthField = StringConverter.class.getDeclaredField("length");
            lengthField.setAccessible(true); // 允许访问私有字段
            lengthField.set(stringConverter, length); // 设置字符串长度
        } catch (Exception e) {
            System.err.println("设置字符串长度失败: " + e.getMessage());
            // 失败时使用默认长度（通常为1）
        }
        return stringConverter.extract(String.class, allData, byteOffset, 0);
    }


}